package com.bbdjt.weixin.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.rubyeye.xmemcached.MemcachedClient;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.DefaultHostnameVerifier;
import org.apache.http.conn.util.PublicSuffixMatcher;
import org.apache.http.conn.util.PublicSuffixMatcherLoader;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class HttpClientUtil {
	private static RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000).setConnectionRequestTimeout(15000)
			.build();

	private static HttpClientUtil instance = null;

	private HttpClientUtil() {
	}

	public static HttpClientUtil getInstance() {
		if (instance == null) {
			instance = new HttpClientUtil();
		}
		return instance;
	}

	/**
	 * 发送 post请求
	 * 
	 * @param httpUrl
	 *            地址
	 */
	public String sendHttpPost(String httpUrl) {
		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
		return sendHttpPost(httpPost);
	}

	/**
	 * 发送 post请求
	 * 
	 * @param httpUrl
	 *            地址
	 * @param params
	 *            参数(格式:key1=value1&key2=value2)
	 */
	public String sendHttpPost(String httpUrl, String params) {
		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
		try {
			// 设置参数
			StringEntity stringEntity = new StringEntity(params, "UTF-8");
			stringEntity.setContentType("application/x-www-form-urlencoded");
			httpPost.setEntity(stringEntity);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sendHttpPost(httpPost);
	}

	/**
	 * 发送 post请求
	 * 
	 * @param httpUrl
	 *            地址
	 * @param maps
	 *            参数
	 */
	public static String sendHttpPost(String httpUrl, Map<String, String> maps) {
		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
		// 创建参数队列
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		for (String key : maps.keySet()) {
			nameValuePairs.add(new BasicNameValuePair(key, maps.get(key)));
		}
		try {
			httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sendHttpPost(httpPost);
	}

	/**
	 * 发送 post请求（带文件）
	 * 
	 * @param httpUrl
	 *            地址
	 * @param maps
	 *            参数
	 * @param fileLists
	 *            附件
	 */
	public static String sendHttpPost(String httpUrl, Map<String, String> maps, File fileLists) {
		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
		MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create();
		for (String key : maps.keySet()) {
			meBuilder.addPart(key, new StringBody(maps.get(key), ContentType.TEXT_PLAIN));
		}

		FileBody fileBody = new FileBody(fileLists);
		meBuilder.addPart("file", fileBody);

		HttpEntity reqEntity = meBuilder.build();
		httpPost.setEntity(reqEntity);
		return sendHttpPost(httpPost);
	}

	/**
	 * 发送 post请求（带文件）
	 * 
	 * @param httpUrl
	 *            地址
	 * @param maps
	 *            参数
	 * @param fileLists
	 *            附件
	 */
	public String sendHttpPost(String httpUrl, Map<String, String> maps, List<File> fileLists) {
		HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
		MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create();
		for (String key : maps.keySet()) {
			meBuilder.addPart(key, new StringBody(maps.get(key), ContentType.TEXT_PLAIN));
		}
		for (File file : fileLists) {
			FileBody fileBody = new FileBody(file);
			meBuilder.addPart("files", fileBody);
		}
		HttpEntity reqEntity = meBuilder.build();
		httpPost.setEntity(reqEntity);
		return sendHttpPost(httpPost);
	}

	/**
	 * 发送Post请求
	 * 
	 * @param httpPost
	 * @return
	 */
	private static String sendHttpPost(HttpPost httpPost) {
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try {
			// 创建默认的httpClient实例.
			httpClient = HttpClients.createDefault();
			httpPost.setConfig(requestConfig);
			// 执行请求
			response = httpClient.execute(httpPost);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭连接,释放资源
				if (response != null) {
					response.close();
				}
				if (httpClient != null) {
					httpClient.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return responseContent;
	}

	/**
	 * 发送 get请求
	 * 
	 * @param httpUrl
	 */
	public static String sendHttpGet(String httpUrl) {
		HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求
		return sendHttpGet(httpGet);
	}

	/**
	 * 发送 get请求Https
	 * 
	 * @param httpUrl
	 */
	public String sendHttpsGet(String httpUrl) {
		HttpGet httpGet = new HttpGet(httpUrl);// 创建get请求
		return sendHttpsGet(httpGet);
	}

	/**
	 * 发送Get请求
	 * 
	 * @param httpPost
	 * @return
	 */
	private static String sendHttpGet(HttpGet httpGet) {
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try {
			// 创建默认的httpClient实例.
			httpClient = HttpClients.createDefault();
			httpGet.setConfig(requestConfig);
			// 执行请求
			response = httpClient.execute(httpGet);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭连接,释放资源
				if (response != null) {
					response.close();
				}
				if (httpClient != null) {
					httpClient.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return responseContent;
	}

	/**
	 * 发送Get请求Https
	 * 
	 * @param httpPost
	 * @return
	 */
	private String sendHttpsGet(HttpGet httpGet) {
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try {
			// 创建默认的httpClient实例.
			PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(new URL(httpGet.getURI().toString()));
			DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(publicSuffixMatcher);
			httpClient = HttpClients.custom().setSSLHostnameVerifier(hostnameVerifier).build();
			httpGet.setConfig(requestConfig);
			// 执行请求
			response = httpClient.execute(httpGet);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				// 关闭连接,释放资源
				if (response != null) {
					response.close();
				}
				if (httpClient != null) {
					httpClient.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return responseContent;
	}
	
	/**

	    * 根据文件id下载文件

	    * 

	    * @param mediaId

	    *            媒体id

	    * @throws Exception

	    */

	   public static  Map<String, Object> getInputStream(MemcachedClient memcachedClient,String mediaId) throws Exception {

	       String accessToken = WeiXinUtil.getAccess_token(memcachedClient);

	       InputStream is = null;
	       String fileName = null;
	       String url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token="

	               + accessToken + "&media_id=" + mediaId;

	       try {

	           URL urlGet = new URL(url);

	           HttpURLConnection http = (HttpURLConnection) urlGet

	                   .openConnection();
	           
	           http.setRequestMethod("GET"); // 必须是get方式请求

	           http.setRequestProperty("Content-Type",

	                   "application/x-www-form-urlencoded");

	           http.setDoOutput(true);

	           http.setDoInput(true);

	           System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒

	           System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒

	           String ContentDisposition = http.getHeaderField("Content-disposition"); 
	           if(null!=ContentDisposition){
	        	   fileName = ContentDisposition.substring(ContentDisposition.lastIndexOf("."),ContentDisposition.length()-1);
	           }else{
	        	   System.out.println("ContentDisposition================================="+ContentDisposition);
	        	   fileName = ".jpg";
	           }
	          // System.out.println(fileName);

	           http.connect();
	           // 获取文件转化为byte流

	           is = http.getInputStream();

	       } catch (Exception e) {

	           e.printStackTrace();

	       }finally {
				
			}
	       
	       HashMap<String, Object> m = new HashMap<String, Object>();
	       m.put("is", is);
	       m.put("fileName", fileName);
	       return m;

	   }

	   /**

	    * 获取下载图片信息（jpg）

	    * 

	    * @param mediaId

	    *            文件的id

	    * @throws Exception

	    */

	   public static String saveImageToDisk(MemcachedClient memcachedClient,String mediaId,String filePath) throws Exception {
		   Map<String, Object> m = getInputStream(memcachedClient, mediaId);
	       InputStream inputStream = (InputStream) m.get("is");

	       byte[] data = new byte[1024];

	       int len = 0;

	       FileOutputStream fileOutputStream = null;

	       try {

	           fileOutputStream = new FileOutputStream(filePath+m.get("fileName"));

	           while ((len = inputStream.read(data)) != -1) {

	               fileOutputStream.write(data, 0, len);

	           }

	       } catch (IOException e) {

	           e.printStackTrace();

	       } finally {

	           if (inputStream != null) {

	               try {

	                   inputStream.close();

	               } catch (IOException e) {

	                   e.printStackTrace();

	               }

	           }

	           if (fileOutputStream != null) {

	               try {

	                   fileOutputStream.close();

	               } catch (IOException e) {

	                   e.printStackTrace();

	               }

	           }

	       }
		return (String) m.get("fileName");

	   }
	   
	   /**

	    * 根据文件id下载文件

	    * 

	    * @param mediaId

	    *            媒体id

	    * @throws Exception

	    */

	   public static  Map<String, Object> getInputStream1(MemcachedClient memcachedClient,String mediaId) throws Exception {

	       String accessToken = WeiXinUtil.getAccess_token(memcachedClient);

	       InputStream is = null;
	       String fileName = null;
	       String url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token="

	               + accessToken + "&media_id=" + mediaId;

	       try {

	           URL urlGet = new URL(url);

	           HttpURLConnection http = (HttpURLConnection) urlGet

	                   .openConnection();
	           
	           http.setRequestMethod("GET"); // 必须是get方式请求

	           http.setRequestProperty("Content-Type",

	                   "application/x-www-form-urlencoded");

	           http.setDoOutput(true);

	           http.setDoInput(true);

	           System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒

	           System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒

	           String ContentDisposition = http.getHeaderField("Content-disposition"); 
	           if(null!=ContentDisposition){
	        	   fileName = ContentDisposition.substring(ContentDisposition.lastIndexOf("."),ContentDisposition.length()-1);
	           }else{
	        	   System.out.println("ContentDisposition================================="+ContentDisposition);
	        	   fileName = ".amr";
	           }
	          // System.out.println(fileName);

	           http.connect();
	           // 获取文件转化为byte流

	           is = http.getInputStream();

	       } catch (Exception e) {

	           e.printStackTrace();

	       }finally {
				
			}
	       
	       HashMap<String, Object> m = new HashMap<String, Object>();
	       m.put("is", is);
	       m.put("fileName", fileName);
	       return m;

	   }

	   /**

	    * 获取下载语音信息（jpg）

	    * 

	    * @param mediaId

	    *            文件的id

	    * @throws Exception

	    */

	   public static String saveImageToDisk1(MemcachedClient memcachedClient,String mediaId,String filePath) throws Exception {
		   Map<String, Object> m = getInputStream1(memcachedClient, mediaId);
	       InputStream inputStream = (InputStream) m.get("is");

	       byte[] data = new byte[10240];

	       int len = 0;

	       FileOutputStream fileOutputStream = null;

	       try {

	           fileOutputStream = new FileOutputStream(filePath+m.get("fileName"));

	           while ((len = inputStream.read(data)) != -1) {

	               fileOutputStream.write(data, 0, len);

	           }

	       } catch (IOException e) {

	           e.printStackTrace();

	       } finally {

	           if (inputStream != null) {

	               try {

	                   inputStream.close();

	               } catch (IOException e) {

	                   e.printStackTrace();

	               }

	           }

	           if (fileOutputStream != null) {

	               try {

	                   fileOutputStream.close();

	               } catch (IOException e) {

	                   e.printStackTrace();

	               }

	           }

	       }
		return (String) m.get("fileName");

	   }   

	public static void main(String[] args) {

		String url = SubsystemIp.getInstance().getValue("msg.url");
		Map<String, String> map = new HashMap<String, String>();
		map.put("account", SubsystemIp.getInstance().getValue("msg.account"));
		map.put("pswd", SubsystemIp.getInstance().getValue("msg.pswd"));
		map.put("mobile", "18632349246");
		map.put("msg", "王彬爱狗屌翔");
		map.put("needstatus", SubsystemIp.getInstance().getValue("msg.needstatus"));
		System.out.println(HttpClientUtil.sendHttpPost(url, map));
	}

}